package com.naiterui.ehp.bs.patient.service;

import java.util.List;

import com.naiterui.ehp.bp.bo.patient.FamilyBO;
import com.naiterui.ehp.bp.domain.Patient;
import com.naiterui.ehp.bp.support.exception.BusinessException;
import com.naiterui.ehp.bs.patient.utils.exception.PatientBusinessException;
import com.naiterui.ehp.bs.patient.vo.family.FamilyLiteVO;
import com.naiterui.ehp.bs.patient.vo.family.FamilyVO;
import com.naiterui.ehp.bs.patient.vo.family.param.FamilyParamVO;

/**
 * 家庭成员业务逻辑接口层
 *
 * @since 2.18
 */
public interface IPatientFamilyService {

    /**
     * 根据患者id获取家庭成员信息
     * IPatientFamilyService.getFamilyListByPatientId()
     *
     * @param patientId
     *
     * @return
     *
     * @throws PatientBusinessException
     * @Date 2018年6月1日
     * @since 2.18
     */
    List<FamilyLiteVO> getFamilyListByPatientId(Long patientId) throws PatientBusinessException;


    /**
     * 医生端获取家庭成员列表
     * <pre>
     *
     * </pre>
     *
     * @param familyIds
     *
     * @return
     *
     * @throws PatientBusinessException
     */
    List<FamilyBO> getDrFamilyList(List<Long> familyIds) throws PatientBusinessException;


    /**
     * 获取家庭成员本人信息，没有则获取患者基本信息
     * IPatientFamilyService.getSelfOrBaseInfo()
     *
     * @param patientId
     *
     * @return
     *
     * @throws PatientBusinessException
     * @Date 2018年9月20日
     * @since 2.24
     */
    FamilyVO getSelfOrBaseInfo(Long patientId) throws PatientBusinessException;

    /**
     * 保存个人基本信息
     * IPatientFamilyService.saveAndGetSelfInfo()
     *
     * @param patientId
     *
     * @return
     *
     * @throws PatientBusinessException
     * @Date 2018年6月2日
     * @since 2.18
     */
    FamilyVO saveAndGetSelfInfo(Long patientId) throws PatientBusinessException;

    /**
     * 根据ID获取家庭成员信息
     * IPatientFamilyService.getFamilyById()
     *
     * @param familyId
     *
     * @return
     *
     * @throws PatientBusinessException
     * @Date 2018年6月2日
     * @since 2.18
     */
    FamilyVO getFamilyById(Long familyId, Long patientId) throws PatientBusinessException;

    /**
     * 新增家庭成员
     * IPatientFamilyService.insertFamily()
     *
     * @param paramVO
     *
     * @throws PatientBusinessException
     * @Date 2018年6月2日
     * @since 2.18
     */
    void insertFamily(Long patientId, FamilyParamVO paramVO) throws PatientBusinessException;

    /**
     * 修改家庭成员信息
     * IPatientFamilyService.updateFamily()
     *
     * @param patientId
     * @param paramVO
     *
     * @throws PatientBusinessException
     * @Date 2018年6月2日
     * @since 2.18
     */
    void updateFamily(Long patientId, Long familyId, FamilyParamVO paramVO) throws PatientBusinessException;

    /**
     * 新增或修改本人信息
     * IPatientFamilyService.insertOrUpdateFamily()
     *
     * @param patient
     *
     * @throws PatientBusinessException
     * @Date 2018年6月2日
     * @since 2.18
     */
    void insertOrUpdateSelf(Patient patient) throws PatientBusinessException;

    /**
     * 患者找医生-新增或修改本人信息
     * IPatientFamilyService.insertOrUpdateSelf()
     *
     * @param patientId
     * @param gender
     * @param birth
     * @param phone
     *
     * @throws PatientBusinessException
     * @Date 2018年9月13日
     * @since 2.24
     */
    FamilyBO insertOrUpdateSelf(Long patientId, Integer gender, String birth, String phone, String name) throws PatientBusinessException;

    /**
     * 根据id获取患者家庭成员
     * IPatientFamilyService.getFamilyById()
     *
     * @param familyId
     *
     * @return
     *
     * @throws PatientBusinessException
     * @Date 2018年6月5日
     * @since 2.18
     */
    FamilyBO getInnerFamilyById(Long familyId) throws PatientBusinessException;

    /**
     * 判断家庭成员关系（根据姓名、性别、年龄）
     * IPatientFamilyService.judgeFamily()
     *
     * @param name
     * @param gender
     * @param age
     * @param ageUnit
     *
     * @return
     *
     * @throws PatientBusinessException
     * @Author lichaopi
     * @Date 2018年6月27日
     * @since 1.0.0
     */
    Integer judgeFamily(Long patientId, String name, Integer gender, Integer age, String ageUnit) throws PatientBusinessException;

    /**
     * 判断是否本人
     * IPatientFamilyService.judgeOneself()
     *
     * @param patientId
     * @param name
     * @param gender
     * @param age
     * @param ageUnit
     *
     * @return 1:是本人：2不是本人：3:患者没有填写记录
     *
     * @throws PatientBusinessException
     * @Author lichaopi
     * @Date 2018年7月19日
     * @since 1.0.0
     */
    Integer judgeOneself(Long patientId, String name, Integer gender, Integer age, String ageUnit) throws PatientBusinessException;

    /**
     * 设置家庭健康档案可见性
     *
     * @param familyId
     * @param visible
     *
     * @throws BusinessException
     */
    void setVisible(Long familyId, Integer visible) throws BusinessException;

}
